package com.cs.code.util;

import com.cs.code.exception.CodeException;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;

/**
 * @package com.cs.code.util
 * @class FtlUtil
 * @desc freemarker模板
 * @author wind
 * @date    2023/9/18 18:26
 * @version v1.0
 */
public class FtlUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(FtlUtil.class);

    private FtlUtil(){

    }

    /**
     * 根据模板生成文件
     * @param name 模板文件名称
     * @param filename 生成文件名称
     * @param data 模板替换数据
     */
    public static void out(String name, String filename, Map<String, Object> data){
        out(null, name, filename, data);
    }

    /**
     * 根据模板生成文件
     * @param dir 模板文件目录
     * @param name 模板文件名称
     * @param filename 生成文件名称
     * @param data 模板替换数据
     */
    public static void out(String dir, String name, String filename, Map<String, Object> data){
        try {
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
            // 设置模板目录
            if(dir == null || "".equals(dir) || "/".equals(dir)){
                cfg.setClassForTemplateLoading(FtlUtil.class, "/");
            }else{
                cfg.setDirectoryForTemplateLoading(new File(dir));
            }
            cfg.setDefaultEncoding("UTF-8");
            cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
            Template temp = cfg.getTemplate(name);
            OutputStream fos = Files.newOutputStream(new File(filename).toPath());
            Writer out = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
            if(data == null){
                data = new HashMap<>();
            }
            temp.process(data, out);
            fos.flush();
            out.close();
        } catch (IOException | TemplateException e) {
            LOGGER.error("FtlUtil.out failed", e);
            throw new CodeException(e);
        }
    }
}
